<?php
/**
 * User: 五哥派
 * Date: 2024/7/1
 * Tel(同WX): 17335592719
 */
namespace app\api\model\dealer;

use app\api\model\Base;
use app\api\model\dealer\User as UserModel;

class Referee extends Base{

    protected $name = 'dealer_referee';


    /**
     * 获取上级用户id
     * @param int $userId
     * @param int $level
     * @param bool $isDealer 必须是分销商
     * @return bool|mixed
     */
    public static function getRefereeUserId(int $userId, int $level, bool $isDealer = false)
    {
        $dealerId = (new self)->where(['user_id' => $userId, 'level' => $level])->value('dealer_id');
        if (!$dealerId) return 0;
        return $isDealer ? (UserModel::isDealerUser($dealerId) ? $dealerId : 0) : $dealerId;
    }

    /**
     * 创建推荐关系
     * @param int $userId 用户ID
     * @param int $refereeId 推荐人ID
     * @return bool
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function createRelation(int $userId, int $refereeId): bool
    {
        // 分销商基本设置
        $setting = Setting::getItem('basic');
        // 是否开启分销功能
        if (!$setting['is_open']) {
            return false;
        }
        // 自分享
        if ($userId == $refereeId) {
            return false;
        }
        // # 记录一级推荐关系
        // 判断当前用户是否已存在推荐关系
        if (self::isExistReferee($userId)) {
            return false;
        }
        // 判断推荐人是否为分销商
        if (!User::isDealerUser($refereeId)) {
            return false;
        }
        // 新增关系记录
        $model = new self;
        $model->add($refereeId, $userId, 1);
        // # 记录二级推荐关系
        if ($setting['level'] >= 2) {
            // 二级分销商id
            $referee2Id = self::getRefereeUserId($refereeId, 1, true);
            // 新增关系记录
            $referee2Id > 0 && $model->add($referee2Id, $userId, 2);
        }
        // # 记录三级推荐关系
        if ($setting['level'] == 3) {
            // 三级分销商id
            $referee3Id = self::getRefereeUserId($refereeId, 2, true);
            // 新增关系记录
            $referee3Id > 0 && $model->add($referee3Id, $userId, 3);
        }
        return true;
    }

    /**
     * 新增关系记录
     * @param int $dealerId 分销商ID
     * @param int $userId 用户ID
     * @param int $level 等级
     * @return bool
     */
    private function add(int $dealerId, int $userId, int $level = 1): bool
    {
        $time = time();
        // 新增推荐关系
        $this->insert([
            'dealer_id' => $dealerId,
            'user_id' => $userId,
            'level' => $level,
            'create_time' => $time,
            'update_time' => $time
        ]);
        // 记录分销商成员数量
        User::setMemberInc($dealerId, $level);
        return true;
    }


    /**
     * 是否已存在推荐关系
     * @param int $userId
     * @return bool
     */
    private static function isExistReferee(int $userId): bool
    {
        return (bool)self::get(['user_id' => $userId]);
    }

}